package com.edu.exam.entity.examination.paper.technical;

import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;
import com.edu.exam.enums.examination.paper.PaperProcessingTaskStatus;

// 导入外部枚举类
import com.edu.exam.enums.examination.paper.SegmentationTaskPriority;
import com.edu.exam.enums.examination.paper.SegmentationProcessingAlgorithm;
import com.edu.exam.enums.examination.paper.SegmentationManualReviewStatus;
import com.edu.exam.enums.examination.paper.SegmentationTaskSource;

/**
 * 智能切分任务实体类
 *
 * 根据E-04-04 智能切分子模块设计实现
 * 对应exam_segmentation_task数据表
 *
 * @author System
 * @version 1.0.0
 */
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
public class SegmentationTask {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 答题卡ID，关联exam_answer_sheet表
     */
    @Column(name = "sheet_id", nullable = false)
    private Long sheetId;

    /**
     * 任务唯一标识符，使用UUID格式
     */
    @Column(name = "task_identifier", nullable = false, unique = true, length = 64)
    private String taskIdentifier;

    /**
     * 任务状态：PENDING（待处理）、PROCESSING（处理中）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_status", nullable = false, length = 20)
    private PaperProcessingTaskStatus taskStatus;

    /**
     * 任务优先级：LOW（低）、MEDIUM（中）、HIGH（高）、URGENT（紧急）
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "priority", nullable = false, length = 10)
    private SegmentationTaskPriority priority;

    /**
     * 使用的切分模板ID，关联exam_segmentation_template表
     */
    @Column(name = "template_id")
    private Long templateId;

    /**
     * 处理算法：TEMPLATE_MATCHING（模板匹配）、BOUNDARY_DETECTION（边界检测）、HYBRID（混合）、DEEP_LEARNING（深度学习）
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "processing_algorithm", nullable = false, length = 30)
    private SegmentationProcessingAlgorithm processingAlgorithm;

    /**
     * 任务提交时间
     */
    @Column(name = "created_time", nullable = false)
    private LocalDateTime createdTime;

    /**
     * 任务开始处理时间
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 任务完成时间
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 任务总耗时（毫秒）
     */
    @Column(name = "total_duration_ms")
    private Long totalDurationMs;

    /**
     * 处理进度（0-100）
     */
    @Column(name = "progress_percentage")
    private Integer progressPercentage;

    /**
     * 当前处理阶段描述
     */
    @Column(name = "current_stage", length = 100)
    private String currentStage;

    /**
     * 错误代码
     */
    @Column(name = "error_code", length = 50)
    private String errorCode;

    /**
     * 错误消息详情
     */
    @Column(name = "error_message", length = 1000, columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 重试次数
     */
    @Column(name = "retry_count")
    private Integer retryCount;

    /**
     * 最大重试次数
     */
    @Column(name = "max_retry_count")
    private Integer maxRetryCount;

    /**
     * 检测到的问题区域数量
     */
    @Column(name = "detected_issue_count")
    private Integer detectedIssueCount;

    /**
     * 成功切分的区域数量
     */
    @Column(name = "successful_segment_count")
    private Integer successfulSegmentCount;

    /**
     * 总共需要切分的区域数量
     */
    @Column(name = "total_segment_count")
    private Integer totalSegmentCount;

    /**
     * 质量分数（0-100）
     */
    @Column(name = "quality_score")
    private Double qualityScore;

    /**
     * 置信度分数（0-100）
     */
    @Column(name = "confidence_score")
    private Double confidenceScore;

    /**
     * 处理参数配置（JSON格式）
     */
    @Column(name = "processing_parameters", length = 2000, columnDefinition = "TEXT")
    private String processingParameters;

    /**
     * 任务创建者ID，关联sys_user表
     */
    @Column(name = "created_by", nullable = false)
    private Long createdBy;

    /**
     * 任务分配给的操作员ID，关联sys_user表
     */
    @Column(name = "assigned_operator_id")
    private Long assignedOperatorId;

    /**
     * 批处理ID，用于批量任务管理
     */
    @Column(name = "batch_id", length = 64)
    private String batchId;

    /**
     * 是否需要人工审核
     */
    @Column(name = "requires_manual_review")
    private Boolean requiresManualReview;

    /**
     * 人工审核状态：PENDING（待审核）、APPROVED（已审核通过）、REJECTED（审核拒绝）、REVISED（已修订）
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "manual_review_status", length = 20)
    private SegmentationManualReviewStatus manualReviewStatus;

    /**
     * 人工审核时间
     */
    @Column(name = "manual_review_time")
    private LocalDateTime manualReviewTime;

    /**
     * 人工审核人员ID，关联sys_user表
     */
    @Column(name = "manual_reviewer_id")
    private Long manualReviewerId;

    /**
     * 人工审核意见
     */
    @Column(name = "manual_review_comment", length = 1000, columnDefinition = "TEXT")
    private String manualReviewComment;

    /**
     * 任务来源：SYSTEM（系统自动）、MANUAL（手动创建）、BATCH_IMPORT（批量导入）、API（API调用）
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_source", nullable = false, length = 20)
    private SegmentationTaskSource taskSource;

    /**
     * 预计完成时间
     */
    @Column(name = "estimated_completion_time")
    private LocalDateTime estimatedCompletionTime;

    /**
     * 实际完成时间（与end_time重复，用于业务查询优化）
     */
    @Column(name = "actual_completion_time")
    private LocalDateTime actualCompletionTime;

    /**
     * 队列等待时间（毫秒）
     */
    @Column(name = "queue_wait_time_ms")
    private Long queueWaitTimeMs;

    /**
     * 任务标签（JSON格式，用于分类和搜索）
     */
    @Column(name = "task_tags", length = 500)
    private String taskTags;

    /**
     * 扩展属性（JSON格式）
     */
    @Column(name = "additional_attributes", length = 2000, columnDefinition = "TEXT")
    private String additionalAttributes;

    // ================================
    // JPA 关联关系
    // ================================

    /**
     * 关联的切分结果列表
     */
    @OneToMany(mappedBy = "segmentationTask", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<SegmentationResult> segmentationResults;

    /**
     * 关联的切分图像列表
     */
    @OneToMany(mappedBy = "segmentationTask", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<SegmentedImage> segmentedImages;

    /**
     * 关联的质量评估记录
     */
    @OneToOne(mappedBy = "segmentationTask", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private SegmentationQuality segmentationQuality;

    // ================================
    // 枚举定义
    // ================================

    

  }
